Use case: USART TX RX in DMA mode

Sequence diagram

USART transmit and receive in DMA mode

@startuml
participant "User Application" as p1
participant "HAL USART driver" as p2
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== USART HAL TransmitReceive DMA ==
p1->p2: <color: green> HAL_USART_TransmitReceive_DMA(&husart, aTxBuffer, aRxBuffer, DATA_TO_SEND_SIZE)
note over p2 #00FF00
Transmitting and receiving data ongoing
end note
p2->p3: HAL_DMA_Start_IT()
p3-->p2: HAL_OK
p2-->p1: HAL_OK

p4<-: DMAx complete interrupt
p4->p3: HAL_DMA_IRQHandler
note over p3 #00FF00
End of transmitting and receiving data
end note
p3->p2: XferCpltCallback
p2->p1: HAL_USART_TxRxCpltCallback(&husart->TxXferCount, husart->RxXferCount)
@enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND_SIZE           256

#define DATA_TO_RECEIVE_SIZE       DATA_TO_SEND_SIZE


uint8_t aTxBuffer[] = " **** USART_SlaveMode **** ";


uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];

USART_HandleTypeDef husart;

/* Ensure that all required peripherals
(USART, GPIO, DMA, NVIC,etc.) are configured properly
/*
...
*/

/* USART register TransmitReceive complete user callback */
HAL_USART_RegisterCallback(&husart, HAL_USART_TX_RX_CB_ID, USART_TxRxCpltCallback);

/* Start a USART TransmitReceive process in dma mode */
HAL_USART_TransmitReceive_DMA(&husart, aTxBuffer,
                                      aRxBuffer, DATA_SIZE)
#define DATA_TO_SEND_SIZE           256

#define DATA_TO_RECEIVE_SIZE       DATA_TO_SEND_SIZE


uint8_t aTxBuffer[] = " **** USART_SlaveMode **** ";


uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];

hal_usart_handle_t usart_handle;

/* Ensure that all required peripherals
(USART, GPIO, DMA, NVIC,etc.) are configured properly
/*
...
*/

/* USART register TransmitReceive complete user callback */
HAL_USART_RegisterTxRxCpltCallback(&usart_handle, USART_TxRxCpltCallback);

/* Start a USART TransmitReceive process in dma mode */
HAL_USART_TransmitReceive_DMA(&usart_handle, aTxBuffer,
                                     aRxBuffer, DATA_TO_SEND_SIZE)

Key changes

  1. HAL2 DMA start uses HAL_DMA_StartPeriphXfer_IT_Opt() (optional interrupt generation) instead of HAL_DMA_Start_IT().

  2. HAL2 provides a dedicated registration API for TX/RX completion callbacks: HAL_USART_RegisterTxRxCpltCallback().